home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d11 / egablk.arc / EGABLANK.ASM next >
Encoding:
Assembly Source File  |  1987-12-05  |  10.8 KB  |  434 lines

  1.            PAGE   61,132
  2.  
  3.            TITLE  EgaBlank 1.0 - Not Copyrighted (nc) 1986 - GDC Software
  4.  
  5.            COMMENT *
  6.  
  7.    EGABLANK.COM -  This program attaches itself to MS-DOS or PC-DOS for
  8.            automatic blanking of an EGA display screen after a given
  9.            number of minutes.
  10.  
  11.     ASSEMBLY    -  MASM EGABLANK;
  12.            LINK EGABLANK;
  13.            EXE2BIN EGABLANK.EXE EGABLANK.COM
  14.  
  15.     AUTHOR    -  Bruce Dubbs
  16.            GDC Software
  17.            122 Valencia Dr.
  18.            Universal City, TX 78148
  19.  
  20.            THIS PROGRAM IS NOT COPYRIGHTED 1986.  IT IS RELEASED INTO
  21.            THE PUBLIC DOMAIN FOR WHATEVER USE YOU WANT.  IF YOU WANT
  22.            TO DISTRIBUTE THIS PROGRAM OR USE IT WITH ANY OTHER WAY,
  23.            AN ACKNOWLEDGEMENT WOULD BE NICE.                *
  24.  
  25.  
  26.            SUBTTL Basic Definitions and Setup
  27.            PAGE
  28.  
  29. TRUE           EQU      0FFFFh
  30. FALSE           EQU      NOT TRUE
  31.  
  32. ON           EQU      TRUE
  33. OFF           EQU      FALSE
  34.  
  35. CR           EQU      0Dh
  36. LF           EQU      0Ah
  37. TAB           EQU      09h
  38. BEL           EQU      07h
  39.  
  40. INT_PER_MIN       EQU      1092               ; PCs have 1092 timer interrupts
  41.                            ;   per minute
  42.  
  43.            .SALL               ; Supress MACRO listings
  44.  
  45. SUBTITLE       MACRO  STRING           ; Change the subtitle but
  46.                            ; don't display SUBTTL command
  47.            SUBTTL STRING
  48.            .LIST
  49.            PAGE
  50.            ENDM
  51.  
  52. PRINT           MACRO  STRING           ; Print a string
  53.            MOV      DX,OFFSET STRING
  54.            MOV      AH,9
  55.            INT      21h
  56.            ENDM
  57.  
  58.  
  59. BIOS           SEGMENT AT 40h
  60.            ORG      87h
  61. EGA_STATUS       LABEL  BYTE
  62. BIOS           ENDS
  63.  
  64.  
  65. CSEG           SEGMENT
  66.  
  67.            ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:NOTHING
  68.  
  69.            ORG      80h
  70. INPUT_COUNT       LABEL  BYTE
  71.            ORG      81h
  72. INPUT_BUFFER       LABEL  BYTE
  73.  
  74.            ORG      100h
  75.  
  76. START:           JMP      TRANSIENT
  77.  
  78. ID           DB      'EgaBlank 1.0'
  79. DELAY           DW      10*INT_PER_MIN       ; Default delay is 10 minutes
  80. COUNTER        DW      0
  81. SCREEN           DB      0FFh
  82. ASCII_DELAY       DW      '10'
  83.            .XLIST
  84.            SUBTITLE <Interrupt 21h routine>
  85.  
  86. REAL21           LABEL  DWORD
  87. REAL21_OFS       DW      ?
  88. REAL21_SEG       DW      ?
  89.  
  90. INT21:           PUSHF               ; Save flags
  91.            CMP      AH,0BDH           ; Is this 'our' function?
  92.            JE      OUR_FUNCTION
  93. OLD:           POPF                ; Restore flags we called with
  94.            JMP      CS:REAL21           ; Otherwise don't mess with the
  95.                            ;   interrupt
  96.  
  97. ; Check if caller is looking for this program
  98.  
  99. OUR_FUNCTION:       PUSH   ES               ; Save registers
  100.            PUSH   CX               ;
  101.            PUSH   SI               ;
  102.            PUSH   DI               ;
  103.  
  104.            PUSH   CS               ; Set destination to us
  105.            POP      ES               ;
  106.            MOV      DI,OFFSET ID           ; Point to our ID
  107.            MOV      CX,12            ;
  108.            CLD
  109.            REPE   CMPSB            ; See if ID is us
  110.  
  111.            POP      DI               ; Restore registers
  112.            POP      SI               ;
  113.            JCXZ   ID_OK            ; If zero, ID matches
  114.            POP      CX               ; Reset registers
  115.            POP      ES               ;
  116.            JMP      OLD               ; And continue to DOS
  117.  
  118. ID_OK:           POP      CX               ; Reset CX
  119.            ADD      SP,2               ; ES stays the same
  120.            NOT      BX               ; Invert BX to say we're here
  121.            POPF
  122.            IRET
  123.  
  124.            .XLIST
  125.            SUBTITLE <Interrupt 1Ch (timer) routine>
  126.  
  127. REAL_1C        LABEL  DWORD
  128. REAL_1C_OFS       DW      ?
  129. REAL_1C_SEG       DW      ?
  130.  
  131. TIMER:           PUSHF               ; Save flags
  132.            PUSH   AX
  133.            PUSH   DS
  134.            MOV      AX,CS
  135.            MOV      DS,AX
  136.            CMP      SCREEN,OFF           ; Is screen already off?
  137.            JE      TIMER_1
  138.            CMP      DELAY,0           ; Is EgaBlank disabled?
  139.            JE      TIMER_1
  140.            INC      COUNTER           ; Bump the counter
  141.            MOV      AX,COUNTER
  142.            CMP      AX,DELAY           ; Check the limit
  143.            JC      TIMER_1
  144.            MOV      SCREEN,OFF
  145.            CALL   SCREEN_OFF
  146. TIMER_1:       POP      DS
  147.            POP      AX
  148.            POPF                ; Restore flags we called with
  149.            JMP      CS:REAL_1C
  150.  
  151.            .XLIST
  152.            SUBTITLE <Interrupt 9 (keyboard) routine>
  153.  
  154. REAL9           LABEL  DWORD
  155. REAL9_OFS       DW      ?
  156. REAL9_SEG       DW      ?
  157.  
  158. KEYBD:           PUSHF               ; Save flags
  159.            PUSH   AX
  160.            PUSH   DS
  161.            MOV      AX,CS
  162.            MOV      DS,AX
  163.            MOV      COUNTER,0           ; Reset the counter
  164.            CMP      SCREEN,ON           ; If screen on, continue
  165.            JE      KEYBD_1
  166.  
  167.            MOV      SCREEN,ON
  168.            CALL   SCREEN_ON
  169.            POP      DS               ; Restore registers
  170.            POP      AX
  171.            POPF
  172.  
  173.            PUSH   AX               ; Throw away keystroke
  174.            IN      AL,60h
  175.            IN      AL,61h
  176.            MOV      AH,AL
  177.            OR      AL,80h
  178.            OUT      61H,AL
  179.            XCHG   AH,AL
  180.            OUT      61H,AL
  181.            CLI
  182.            MOV      AL,20h
  183.            OUT      20h,AL
  184.            POP      AX
  185.            IRET
  186.  
  187. KEYBD_1:       POP      DS
  188.            POP      AX
  189.            POPF                ; Restore flags we called with
  190.            JMP      CS:REAL9
  191.  
  192.            .XLIST
  193.            SUBTITLE <Interrupt 10h (video io) routine>
  194.  
  195. REAL10           LABEL  DWORD
  196. REAL10_OFS       DW      ?
  197. REAL10_SEG       DW      ?
  198.  
  199. VIDEO:           PUSHF               ; Save flags
  200.            PUSH   AX
  201.            PUSH   DS
  202.            MOV      AX,CS
  203.            MOV      DS,AX
  204.            MOV      COUNTER,0
  205.            CMP      SCREEN,ON
  206.            JE      VIDEO_1
  207.            MOV      SCREEN,ON
  208.            CALL   SCREEN_ON
  209. VIDEO_1:       POP      DS
  210.            POP      AX
  211.            POPF                ; Restore flags we called with
  212.            JMP      CS:REAL10
  213.  
  214.            .XLIST
  215.            SUBTITLE <Screen on/off procedure>
  216.  
  217. SCREEN_ON:       MOV      AL,20h
  218.            JMP      Short SCREEN_IO
  219.  
  220. SCREEN_OFF:       MOV      AL,0
  221.  
  222. SCREEN_IO:       PUSH   DX
  223.            PUSH   AX
  224.            MOV      DX,03BAh
  225.            IN      AL,DX            ; Reset mono flip-flop
  226.            MOV      DL,0DAh
  227.            IN      AL,DX            ; Reset color flip-flop
  228.            MOV      DL,0C0h           ; Attribute port
  229.            POP      AX               ; Get on/off pattern
  230.            OUT      DX,AL            ; Turn screen on or off
  231.            POP      DX
  232.            RET
  233.  
  234.            .XLIST
  235.            SUBTITLE <Installation and info procedure>
  236.  
  237. ERROR           DB      0               ; False
  238. RESIDENT       DB      0FFh               ; True
  239.  
  240. TRANSIENT       PROC   NEAR
  241.  
  242.            MOV      AX,CS            ; Set segment registers
  243.            MOV      DS,AX
  244.            MOV      ES,AX
  245.  
  246. ; Check if EgaBlank is already installed by calling a special (our own)
  247. ; function of INT 21h.
  248.  
  249.            MOV      AH,0BDh           ; Our interrupt
  250.            MOV      SI,OFFSET ID           ; Point to name
  251.            XOR      BX,BX            ; Insure BX is zero
  252.            INT      21h               ; See if already resident
  253.            PUSH   ES               ; Save pointer
  254.            INC      BX               ; If so, BX will now be zero
  255.            JZ      TRANSIENT_2
  256. ; Set INT 21h
  257.            CALL   CHECK_HW
  258.            MOV      AX,3521h           ; GET OLD INT 21 ADDR
  259.            INT      21h
  260.            MOV      REAL21_OFS,BX        ; SAVE IT
  261.            MOV      REAL21_SEG,ES
  262.            MOV      DX,OFFSET INT21      ; POINT TO OFFSET
  263.            MOV      AX,2521h           ; UPDATE THE INTERRUPT
  264.            INT      21h
  265. ; Set INT 1Ch
  266.            MOV      AX,351Ch           ; GET OLD INT 1Ch ADDR
  267.            INT      21h
  268.            MOV      REAL_1C_OFS,BX       ; SAVE IT
  269.            MOV      REAL_1C_SEG,ES
  270.            MOV      DX,OFFSET TIMER      ; POINT TO OFFSET
  271.            MOV      AX,251Ch           ; UPDATE THE INTERRUPT
  272.            INT      21h
  273. ; Set INT 9
  274.            MOV      AX,3509h           ; GET OLD INT 9 ADDR
  275.            INT      21h
  276.            MOV      REAL9_OFS,BX           ; SAVE IT
  277.            MOV      REAL9_SEG,ES
  278.            MOV      DX,OFFSET KEYBD      ; POINT TO OFFSET
  279.            MOV      AX,2509h           ; UPDATE THE INTERRUPT
  280.            INT      21h
  281. ; Set INT 10h
  282.            MOV      AX,3510h           ; GET OLD INT 10 ADDR
  283.            INT      21h
  284.            MOV      REAL10_OFS,BX        ; SAVE IT
  285.            MOV      REAL10_SEG,ES
  286.            MOV      DX,OFFSET VIDEO      ; POINT TO OFFSET
  287.            MOV      AX,2510h           ; UPDATE THE INTERRUPT
  288.            INT      21h
  289.  
  290.            MOV      RESIDENT,FALSE
  291.            PAGE
  292. TRANSIENT_2:       POP      ES               ; Get resident segment
  293.  
  294.            MOV      CH,0
  295.            MOV      CL,INPUT_COUNT       ; See if a new time was passed
  296.            CMP      CL,0
  297.            JE      PRINT_1
  298.            MOV      SI,OFFSET INPUT_BUFFER
  299.            CLD
  300.  
  301. PARSE_1:       LODSB               ; Get a byte
  302.            CMP      AL,' '               ; Skip Tabs and blanks
  303.            JE      PARSE_1
  304.            CMP      AL,TAB
  305.            JE      PARSE_1
  306.            CMP      AL,CR
  307.            JE      PRINT_1           ; End of string - no input
  308.  
  309.            CMP      AL,'0'               ; Check for a number
  310.            JL      SET_ERROR
  311.            CMP      AL,'9'
  312.            JA      SET_ERROR
  313.            MOV      AH,AL            ; Save in AH
  314.  
  315.            LODSB               ; Get next character
  316.            CMP      AL,' '               ; Check for end of input
  317.            JLE      PARSE_3
  318.            CMP      AL,'0'               ; Check for a number
  319.            JL      SET_ERROR
  320.            CMP      AL,'9'
  321.            JG      SET_ERROR
  322.            JMP      SHORT PARSE_4
  323.  
  324. PARSE_3:       MOV      AL,0               ; Set hi digit to nul
  325.            XCHG   AL,AH            ; Get hi & lo digits in order
  326.  
  327. PARSE_4:       MOV      BX,AX            ; Store ASCII minutes in BX
  328.            AND      AX,0F0Fh           ; Make BCD
  329.            AAD                   ; Make Binary
  330.            CMP      AX,60
  331.            JG      SET_ERROR
  332.            MOV      CX,INT_PER_MIN
  333.            MUL      CX
  334.            MOV      ES:DELAY,AX           ; Store counts
  335.            XCHG   BH,BL            ; Put ASCII in order
  336.            MOV      ES:ASCII_DELAY,BX    ; Store ASCII minutes
  337.            JMP      SHORT PRINT_1
  338.  
  339. SET_ERROR:       MOV      ERROR,TRUE
  340.            PAGE
  341.  
  342. PRINT_1:       PRINT  LOGO
  343.            CMP      RESIDENT,TRUE
  344.            JE      PRINT_2
  345.            PRINT  INSTALLED
  346.  
  347. PRINT_2:       CMP      ES:DELAY,0
  348.            JNE      PRINT_3
  349.            PRINT  DEACTIVATED
  350.            JMP      SHORT PRINT_4
  351.  
  352. PRINT_3:       MOV      AX,ES:ASCII_DELAY
  353.            MOV      MINUTES,AX
  354.            PRINT  EGATIME
  355.            CMP      ES:DELAY,INT_PER_MIN
  356.            JE      PRINT_3A
  357.            PRINT  S
  358.            JMP      SHORT PRINT_4
  359. PRINT_3A:       PRINT  NO_S
  360.  
  361. PRINT_4:       CMP      ERROR,TRUE
  362.            JNE      EXIT
  363.            PRINT  ERROR_MSG
  364.  
  365. ; Just terminate if we are already resident
  366.  
  367. EXIT:           CMP      RESIDENT,TRUE
  368.            JNE      EXIT_1
  369.            MOV      AX,4C00H           ; OK RETURN
  370.            INT      21H               ; TERMINATE
  371.  
  372. ; Exit but stay resident - set paragraphs to save
  373.  
  374. PARAS           =      ((ERROR-START+100h) SHR 4) + 1 ;
  375.  
  376. EXIT_1:        MOV      DX,PARAS           ; SET LENGTH TO RESERVE
  377.            MOV      AX,3100H
  378.            INT      21H               ; TERMINATE & STAY RESIDENT
  379.  
  380.            PAGE
  381.  
  382. LOGO           DB      CR,LF,TAB,'EgaBlank by GDC Software $'
  383. INSTALLED       DB      'installed.$'
  384.  
  385. EGATIME        DB      CR,LF,TAB,'EgaBlank timeout set to '
  386. MINUTES        LABEL  WORD
  387.            DB      '10 minute$'
  388. S           DB      's.',CR,LF,'$'
  389. NO_S           DB      '.',CR,LF,'$'
  390.  
  391. ERROR_MSG       DB      CR,LF,TAB,BEL,'Illegal parameter - ignored'
  392.            DB      LF
  393.            DB      CR,LF,TAB,'Usage: EGABLANK m'
  394.            DB      CR,LF,TAB,TAB,'m = The time in minutes (0 to 60) before'
  395.            DB      CR,LF,TAB,TAB,'the screen is blanked.  Use 0 to turn'
  396.            DB      CR,LF,TAB,TAB,'EgaBlank off.',LF,CR,'$'
  397.  
  398. DEACTIVATED       DB      CR,LF,TAB,'EgaBlank is deactivated',CR,LF,'$'
  399.  
  400. TRANSIENT       ENDP
  401.  
  402.            .XLIST
  403.            SUBTITLE <Check for EGA board>
  404.  
  405. CHECK_HW       PROC   NEAR
  406.  
  407.            MOV      AX,SEG BIOS           ; Get EGA status byte
  408.            MOV      ES,AX
  409.            MOV      AL,ES:EGA_STATUS
  410.            CMP      AL,0               ; If zero, no EGA present
  411.            JE      NO_EGA
  412.            TEST   AL,00001000b           ; If bit 3 not set, EGA is
  413.            JNZ      EGA_NOT_ACTIVE       ;   present but not active
  414.            RET                   ; Present & active - do nothing
  415.  
  416. NO_EGA:        PRINT  NO_BOARD           ; Print message and terminate
  417.            JMP      SHORT ERROR_EXIT
  418.  
  419. EGA_NOT_ACTIVE:    PRINT  NOT_ACTIVE
  420.  
  421. ERROR_EXIT:       PRINT  NOT_INSTALLED
  422.            MOV      AX,4CFFh
  423.            INT      21h
  424.  
  425. NO_BOARD       DB      CR,LF,BEL,'EGA board not installed.$'
  426. NOT_ACTIVE       DB      CR,LF,BEL,'EGA board not active.$'
  427. NOT_INSTALLED       DB      CR,LF,'EgaBlank NOT activated.',CR,LF,'$'
  428.  
  429. CHECK_HW       ENDP
  430.  
  431. CSEG           ENDS
  432.  
  433.            END      START
  434.